package com.反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

public class getClassinfo {
  public static void main(String[] args) throws Exception {
    //
    String path = "com.反射.Person";
    Class clazz = Class.forName(path);
    System.out.println("类信息为：" + clazz);
    System.out.println("完整类名为：" + clazz.getName());
    Class supercls = clazz.getSuperclass();
    System.out.println("父类信息为：" + supercls);
    System.out.println("访问修饰符为：" + Modifier.toString(clazz.getModifiers()));
    System.out.println("------------打印构造器方法-----------");
    printConstructors(clazz);
    System.out.println();
    System.out.println("------------打印方法-----------");
    printMethods(clazz);
    System.out.println("------------打印属性-----------");
    printFields(clazz);
    System.out.println("----------------------------------------------");

  }


  public static void printConstructors(Class cl){
    /*返回反映Constructor对象表示的类声明的所有Constructor对象的数组类 。
         这些是public，protected，default（package）访问和私有构造函数。
         返回的数组中的元素不会排序，并且不是任何特定的顺序。
         如果类有一个默认构造函数，它将包含在返回的数组中。
         如果类对象表示接口，原始类型，数组类或空值，则此方法返回长度为0的数组。
    */
    Constructor[] constructors = cl.getDeclaredConstructors();
    System.out.println("此类包含构造器：" + Arrays.toString(constructors));
    System.out.print("构造器信息：");
    for (Constructor constructor : constructors) {
      System.out.print(Modifier.toString(constructor.getModifiers()));
      Class[] parm = constructor.getParameterTypes();
      System.out.print(Arrays.toString(parm)+ " -- ");
    }
  }
  public static void printMethods(Class cl){
    Method[] methods = cl.getDeclaredMethods();
    System.out.println(Arrays.toString(methods));
  }

  public static void printFields(Class cl){
    Field[] fields = cl.getDeclaredFields();
    System.out.println(Arrays.toString(fields));

  }
}
